package com.sinosoft.config.fallback;
//
//import java.io.ByteArrayInputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.nio.charset.Charset;
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.netflix.client.ClientException;
//import com.sinosoft.enums.http.StatusCode;
//import com.sinosoft.vo.http.Result;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.MediaType;
//import org.springframework.http.client.ClientHttpResponse;
//import org.springframework.stereotype.Component;
//
//import com.alibaba.fastjson.JSONException;
//import com.alibaba.fastjson.JSONObject;
//import com.netflix.hystrix.exception.HystrixTimeoutException;
//
///**
// * 自定义Zuul回退机制处理器。
// *
// * Provides fallback when a failure occurs on a route
// * 英文意思就是说提供一个回退机制当路由后面的服务发生故障时。
// */
//@Component
//public class ApiGatewayFallbackProvider implements FallbackProvider {
//    @Autowired
//    private ClientHttpResponseFactory clientHttpResponseFactory;
//	/**
//     * 返回值表示需要针对此微服务做回退处理（该名称一定要是注册进入 eureka 微服务中的那个 serviceId 名称）；
//     * 表明是为哪个微服务提供回退，*表示为所有微服务提供回退
//     * @return
//     */
//
//	@Override
//	public String getRoute() {
//		return "*";
//	}
//	/**
//	 * 网关向api服务请求是失败了，但是消费者客户端向网关发起的请求是OK的，
//	 * 不应该把api的404,500等问题抛给客户端
//	 * 网关和api服务集群对于客户端来说是黑盒子
//	 */
//
//	@Override
//	public ClientHttpResponse fallbackResponse(String route, Throwable cause){
//
//		if(cause instanceof HystrixTimeoutException){
//			return getClientHttpResponse(HttpStatus.GATEWAY_TIMEOUT,cause);
//		} if (cause instanceof ClientException){
//			return getClientHttpResponse(HttpStatus.NOT_FOUND ,cause);
//		}else{
//			return this.fallbackResponse(cause);
//		}
//	}
//
//	public ClientHttpResponse fallbackResponse(Throwable cause){
//		return this.getClientHttpResponse(HttpStatus.INTERNAL_SERVER_ERROR,cause);
//	}
//
//    private ClientHttpResponse getClientHttpResponse( HttpStatus status,Throwable cause){
//        return clientHttpResponseFactory.getClientHttpResponse(status,cause);
//    }
//	private ClientHttpResponse response(final HttpStatus status){
//
//		return new ClientHttpResponse() {
//			@Override
//			public HttpStatus getStatusCode() throws IOException {
//				return status;
//			}
//			@Override
//			public int getRawStatusCode() throws IOException{
//				return status.value();
//			}
//			@Override
//			public String getStatusText() throws IOException{
//				return status.getReasonPhrase();
//			}
//			@Override
//			public void close(){
//			}
//			 /**
//             * 当 springms-provider-user 微服务出现宕机后，客户端再请求时候就会返回 fallback 等字样的字符串提示；
//             * 但对于复杂一点的微服务，我们这里就得好好琢磨该怎么友好提示给用户了；
//             * 如果请求用户服务失败，返回什么信息给消费者客户端
//             * @return
//             * @throws IOException
//             */
//
//			@Override
//			public InputStream getBody() throws IOException {
//				Result result = Result.failure(StatusCode.MICRO_SERVICE_UNAVAILABLE);
//				ObjectMapper objectMapper = new ObjectMapper();
//				String content = objectMapper.writeValueAsString(result);
//				return new ByteArrayInputStream(content.getBytes("UTF-8"));
//			}
//			@Override
//			public HttpHeaders getHeaders(){
//
//				// headers设定
//				HttpHeaders headers = new HttpHeaders();
//
//				MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));
//				headers.setContentType(mt);
//				return headers;
//			}
//
//		};
//
//	}
//
//}